<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>
<script !src="">
    //     (1) 定义
    //     浅拷贝： 将原对象或原数组的引用直接赋给新对象，新数组，新对象／数组只是原对象的一个引用
    //     深拷贝： 创建一个新的对象和数组，将原对象的各项属性的“值”（数组的所有元素）拷贝过来，是“值”而不是“引用”
    // (2) 浅拷贝
    //     下面这段代码就是浅拷贝，有时候我们只是想备份数组，但是只是简单让它赋给一个变量，改变其中一个，另外一个就紧跟着改变，但很多时候这不是我们想要的


    // 浅拷贝
    // var obj = {
    //     name: 'wsscat',
    //     age: 0
    // }
    // var obj2 = obj;
    // obj2['c'] = 5;
    // console.log(obj);//Object {name: "wsscat", age: 0, c: 5}
    // console.log(obj2);////Object {name: "wsscat", age: 0, c: 5}
    //
    // var arr1 = [1, 2, 3, 4];
    // var arr2 = arr1;
    // arr2.push(5);
    // console.log(arr1); // [1,2,3,4,5]
    // console.log(arr2); // [1,2,3,4,5]

    // 深拷贝(只拷贝第一层)
    // 拷贝数组

    // 使用slice实现
    var arr = ['wsscat', 'autumns', 'winds'];
    var arrCopy = arr.slice(0);
    arrCopy[0] = 'tacssw'
    console.log(arr)//['wsscat', 'autumns', 'winds']
    console.log(arrCopy)//['tacssw', 'autumns', 'winds']

    // 使用concat实现
    var arr = ['wsscat', 'autumns', 'winds'];
    var arrCopy = arr.concat();
    arrCopy[0] = 'tacssw'
    console.log(arr)//['wsscat', 'autumns', 'winds']
    console.log(arrCopy)//['tacssw', 'autumns', 'winds']

    // 使用扩展运算符...
    var arr1 = [1,2,3,4];
    var arr2 = [...arr1];


    // 拷贝对象
    // 遍历属性并赋给新对象
    var obj = {
        name:'wsscat',
        age:0
    }

    var obj2 = new Object();
    obj2.name = obj.name;
    obj2.age = obj.age

    obj.name = 'autumns';
    console.log(obj);//Object {name: "autumns", age: 0}
    console.log(obj2);//Object {name: "wsscat", age: 0}


    // es6的Object.assign方法
    // Object.assign：用于对象的合并，将源对象（source）的所有可枚举属性，复制到目标对象（target），并返回合并后的target
    var obj = {
        name: '彭湖湾',
        job: '学生'
    }
    var copyObj = Object.assign({}, obj);


    // 扩展运算符
    let obj1 = {a:2, b:3};
    let obj2 = {...obj1};

</script>
